home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / spamexperts / storage.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  7.0 KB  |  208 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Database management framework.
  5. '''
  6. import sys
  7. from spambayes.storage import ZODBClassifier
  8. from spamexperts.Options import options
  9.  
  10. class baseDBWrapper:
  11.     '''
  12.     This simple wrapper is found all over the spamexperts/spambayes code
  13.     Finally now as a base class
  14.     '''
  15.     
  16.     def __init__(self, db_name, mode = 'c'):
  17.         self.db_name = db_name
  18.         self.mode = mode
  19.         self.load()
  20.  
  21.     
  22.     def load(self):
  23.         
  24.         try:
  25.             self.dbm = open(self.db_name, self.mode)
  26.             self.db = shelve.Shelf(self.dbm)
  27.         except error:
  28.             print >>sys.stderr, 'Warning: no dbm modules available for MessageInfoDB'
  29.             self.dbm = None
  30.             self.db = None
  31.  
  32.  
  33.     
  34.     def __del__(self):
  35.         self.close()
  36.  
  37.     
  38.     def close(self):
  39.         
  40.         def noop():
  41.             pass
  42.  
  43.         getattr(self.db, 'close', noop)()
  44.         getattr(self.dbm, 'close', noop)()
  45.  
  46.     
  47.     def store(self):
  48.         if self.db is not None:
  49.             self.db.sync()
  50.         
  51.  
  52.     
  53.     def add(self, key, *args):
  54.         self.db[key] = args
  55.         self.store()
  56.  
  57.     
  58.     def get(self, key):
  59.         return self.db[key]
  60.  
  61.     
  62.     def set(self, key, *args):
  63.         pass
  64.  
  65.     
  66.     def remove(self, key):
  67.         del self.db[key]
  68.         self.store()
  69.  
  70.     
  71.     def has_key(self, key):
  72.         return self.db.has_key(key)
  73.  
  74.     
  75.     def keys(self):
  76.         return self.db.keys()
  77.  
  78.     
  79.     def items(self):
  80.         return self.db.items()
  81.  
  82.     
  83.     def values(self):
  84.         return self.db.values()
  85.  
  86.     
  87.     def first(self):
  88.         return self.dbm.first()
  89.  
  90.     
  91.     def len(self):
  92.         return len(self.dbm.keys())
  93.  
  94.     
  95.     def __contains__(self, key):
  96.         return self.db.has_key(key)
  97.  
  98.     
  99.     def __getitem__(self, key):
  100.         return self.db[key]
  101.  
  102.     
  103.     def __setitem__(self, key, value):
  104.         self.db[key] = value
  105.  
  106.  
  107.  
  108. class TransitMessagesBase(object):
  109.     '''Keep track of information about messages that are in the corpus, and
  110.     are in transit somehow (blocked, waiting to be put on an IMAP server,
  111.     waiting to be delivered to a POP client, etc).'''
  112.     
  113.     def addMessage(self, account, msgid, msginfo):
  114.         '''Add a message to the database.'''
  115.         if options[('globals', 'verbose')]:
  116.             print >>sys.stderr, 'Adding message %s' % (msgid,)
  117.         
  118.         self_messages = self.get(account)
  119.         self_messages[msgid] = msginfo
  120.         self.db[account] = self_messages
  121.         self.store()
  122.  
  123.     
  124.     def takeMessage(self, account, msgid, fromdb):
  125.         '''Move a message from the given database to this one.'''
  126.         from_messages = fromdb.get(account)
  127.         if options[('globals', 'verbose')]:
  128.             print >>sys.stderr, 'Message info %s' % (from_messages[msgid],)
  129.         
  130.         self.addMessage(account, msgid, from_messages[msgid])
  131.         fromdb.removeMessageFromDB(account, msgid)
  132.  
  133.     
  134.     def removeMessageFromDB(self, account, msgid):
  135.         '''Remove message with given msgid from given account database.'''
  136.         messages = self.get(account)
  137.         if messages.has_key(msgid):
  138.             del messages[msgid]
  139.             self.db[account] = messages
  140.             self.store()
  141.         
  142.  
  143.  
  144.  
  145. class TransitMessagesDB(TransitMessagesBase, baseDBWrapper):
  146.     pass
  147.  
  148.  
  149. try:
  150.     from persistent import Persistent
  151. except ImportError:
  152.     Persistent = object
  153.  
  154.  
  155. class _PersistentTransitMessages(TransitMessagesBase, Persistent):
  156.     
  157.     def __init__(self):
  158.         import ZODB
  159.         OOBTree = OOBTree
  160.         import BTrees.OOBTree
  161.         TransitMessagesBase.__init__(self)
  162.         self.db = OOBTree()
  163.  
  164.     
  165.     def __getstate__(self):
  166.         return self.db
  167.  
  168.     
  169.     def __setstate__(self, state):
  170.         self.db = state
  171.  
  172.  
  173.  
  174. class TransitMessagesZODB(ZODBClassifier):
  175.     ClassifierClass = _PersistentTransitMessages
  176.     
  177.     def __init__(self, db_name):
  178.         self.nham = self.nspam = 0
  179.         ZODBClassifier.__init__(self, db_name)
  180.         self.classifier.store = self.store
  181.         self.classifier.get = self.get
  182.  
  183.     
  184.     def __setattr__(self, att, value):
  185.         object.__setattr__(self, att, value)
  186.  
  187.     
  188.     def __contains__(self, key):
  189.         return self.classifier.db.has_key(key)
  190.  
  191.     
  192.     def has_key(self, key):
  193.         return self.classifier.db.has_key(key)
  194.  
  195.     
  196.     def __getitem__(self, key):
  197.         return self.classifier.db[key]
  198.  
  199.     
  200.     def __setitem__(self, key, value):
  201.         self.classifier.db[key] = value
  202.  
  203.     
  204.     def get(self, key):
  205.         return self.classifier.db[key]
  206.  
  207.  
  208.